# 课后问答题
# 1，Python中new方法作用是什么？
# new方法通常用于创建并返回一个新的实例对象。这个方法必须接受至少一个参数，即类本身（通常是cls），并返回一个新创建的对象实例。
# 只有继承了object的类才会有__new__方法。在Python 3中，所有的类都默认是从object类继承而来的，因此所有的类都有__new__方法。
# 2，什么是单例模式？单例模式适用于什么场景？
# 单例模式是一种常用的软件设计模式，它确保一个类只有一个实例，并提供一个全局访问点来访问该实例。
# 单例模式适用于以下场景：
# 需要确保某个类只有一个实例的场景。例如，Windows的任务管理器、回收站、网站的计数器等。
# 需要提供全局访问点的场景。例如，应用程序的日志应用、数据库连接池的设计和多线程的线程池的设计等。在这些场景中，单例模式可以提供方便的访问点来访问这些资源。
# 3，私有化方法与私有化属性在子类中能否继承？
# 不能，子类只能继承父类的公有属性和方法
# 4，在Python中什么是异常？
# 异常是通过异常对象来表示的，异常对象包含异常类型，错误信息和异常引发位置等。
# 5，Python中是如何处理异常的？
# 异常处理主要通过try，except等关键字进行
# 6，Python中异常处理语句的一般格式？可以使用伪代码的形式描述。
# try:
#     尝试执行的代码（可能出现错误的代码）
# except：
#     针对错误类型，对应的代码处理（出错之后执行的代码）
# else：
#     没有异常才会执行的代码（当try中的代码没有出现异常的情况下才会执行）
# finally：
#     无论是否有异常，都会执行的代码
# 7，__slots__属性的作用？
# 决定类的实例将具有哪些属性，限制要添加的实例属性
# 节省内存空间，因为默认所有可以用的属性都在__dict__属性中存储，占用内存空间较大
# 8，私有化属性的作用？
# 保护数据，封装性的体现
# 9，在类外面是否能修改私有属性？
# 不可以直接修改，但可以通过方法去实现，还可以借助属性函数property去实现
# 10，如果一个类中，只有指定的属性或者方法能被外部修改，那么该如何限制外部修改？
# 对属性或方法进行私有化的设定
# 课后实操题
# 1，编写一段代码以完成下面的要求
# ·定义一个Person类，类中要有初始化方法，方法中要有人的姓名，年龄两个私有属性。
# ·提供获取用户信息的方法。
# ·提供获取私有属性的方法。
# ·提供可以设置私有属性的方法。
# ·设置年龄的范围在(1-120)的方法，如果不在这个范围，不能设置成功。
class Person:
    def __init__(self,n,a):
        '''初始化方法'''
        self.__name=n
        self.__age=a
        pass
    def __str__(self):
         '''获取用户信息的方法'''
         return '{}的年龄是：{}'.format(self.__name,self.__age)
    def getAgeInfo(self):
        return self.__age
    def setAge(self,age):
        if age>0 and age<120:
            self.__age=age
            pass
        else:
            print('您输入的数据不合理')
    def getNameInfo(self):
        return self.__name
    def detName(self,name):
        self.__name=name
# 2，请写一个单例模式
# 利用类属性保存初次创建的实例对象，第二次实例化的时候判断类属性是否有保存的实例对象，如果有就返回类属性保存的，如果没有就调用父类__new__方法创建新的实例对象
# 3，创建一个类，并定义两个私有化属性，提供一个获取属性的方法，和设置属性的方法。利用propery属性给调用者提供属性方式的调用获取和设置私有属性方法的方式。
class Student:
    def __init__(self):
        self.__name='张三'
        self.__score=90
        pass
    @property
    def name(self):
        return self.__name
    @name.setter
    def name(self,name):
        self.__name=name
        pass
    @property
    def score(self):
        return self.__score
    @score.setter
    def score(self, score):
        self.__score = score
        pass
    def __str__(self):
        return self.__name
    def __call__(self, *args, **kwargs):
        # print(self.__name+'的得分是：'+str(self.__score))
        print('{}的得分是：{}'.format(self.__name,self.__score))
        pass
    pass
xw=Student()
xw()#将实例对象以函数的形式去调用
print(xw)
xw.name='李四'
xw.score=98
xw()
# 4，创建一个Animal类，实例化一个cat对象，请给cat对象动态绑定一个run方法，给类绑定一个类属性colour，给类绑定一个类方法打印字符串'ok'。
import types
def run(self):
    print('小猫飞快的跑...')
    pass
# 类方法是属于整个类的，而不属于某个具体的对象。这意味着类方法可以直接通过类名调用，而不需要创建类的实例。实例方法则必须通过类的实例来调用。
# 类方法主要用于操作类本身，例如创建新的实例、修改类属性等。实例方法则主要用于操作类的实例，例如读取或修改实例属性、调用其他实例方法等。
@classmethod
def info(cls):
    print('ok')
class Animal:
    pass
cat=Animal()
cat.run=types.MethodType(run,cat)#动态添加实例方法(前面是添加的方法，后面是添加给的对象)
cat.run()
Animal.colour='黑色'#添加类属性
print(cat.colour)
Animal.info=info
Animal.info()
